#============================================
# bbs表设计
# 1.用户表
#  继承AbstractUser
#  扩展
#     phone        电话号码
#     avatar        用户头像
#     create_ time  创建时间
#   外键字段
#           一对一个人站点

# 2.个人站点表
#     site_ name       站点名称
#     site_ title     站点标题
#     site_ theme     站点样式

# 3.文章标签表
#     name        标签名
#     外键字段
#           一对多个人站点

# 4.文章分类表
#     name        分类名
#     外键字段
#           一对多个人站点

# 5.文章表
#     title     文章标题
#     desc      文章简介
#     content    文章内容
#     create_time 发布时间
#     数据库字段设计优化( ******) 
#     (虽然下述的三个字段可以从其他表里面跨表查询计算得出，但是频繁跨表效率)
#     up_num      点赞数
#     down_num     点踩数
#     comment_num     评论数
#     外键字段
#           一对多个人站点
#           多对多文章标签表
#           一对多文章分类

# 6.点赞点踩表
#     记录哪个用户给哪篇文章点了赞还是点了踩
#     user     用户 ForeignKey(to='User')
#     article   文章 ForeignKey(to='Article')
#     is_up     是否点赞  BooleanField()

# 7.文章评论表
#     记录哪个用户给哪篇文章写了哪些评论内容
#     user      用户     ForeignKey(to='User')
#     article   文章     ForeignKey(to='Article')
#     content    评论    CharField()
#     comment_time  评论信息   DateField()
  
 
     
#自关联
# parent        ForeignKey ( to=" Comment" , null=True)
# ORM专门提供的自关联写法
# parent         ForeignKey (to="self" ,null=True )

# id     user_ id    article_ id   parent_ id
# 1         1          1
# 2         2          1               1

# 根评论子评论的概念
#   根评论就是直接评论当前发布的内容的
# 子评论是评论别人的评论
# 1. PHP是世界上最牛逼的语言
#     1.1 python才 是最牛逼的
#         1.2 java才是
# 根评论与子评论是一对多的关系
#============================================
# 我们之前是直接在views . py中书写的forms组件代码
# 但是为了接耦合应该将所有的forms组件代码单独写到一个地方
# 如果你的项目至始至终只用到一个forms组件那么你可以直接建一个py文件书写即可
# 但是如果你的项目需要使用多个forms组件，那么你可以创建一个文件夹在文件夹内根据
# forms组件功能的不同创建不同的py文件
# myforms文件夹
# regform. PY
# loginform.py
# userform. PY
# orderform.py

# class:from-group可以分组相当于多个p标签

# label for=''可以放id和点击id一样的效果,只要是在label中都可以有这个效果
# <label for="myfile">头像
# <p><input type="file" name = 'photo' style="display: none" id="myfile"></p>


#     {#1 生成一个问价你阅读器#}
#     let readfileobj = new FileReader();
#     {#2 获取得到的文件#}
#     let fileobj = $(this)[0].files[0];
#     {#3 读取文件#}
#     readfileobj.readAsDataURL(fileobj); //异步操作 IO操作
#     {#4 利用文件阅读器展示到前端页面 修改src属性#}
#     {#等待文件阅读器加载完,在读   onload#}
#     readfileobj.onload = function () {
#         $('#photo').attr('src',readfileobj.result)
#     }
# })


# {#console.log($('#myform').serializeArray())#}  //[{},{},{}]列表套数组
# $.each($('#myform').serializeArray(),function(index,obj) {
#     dataobj.append(obj.name,obj.value)             
#  通过myform拿到所有普通Input框内容用each循环添加obj
# })

# success:function (args) {
#     if(args.code ==200){
#         window.location.href = args.msg
#     }else{
#         {#console.log(args.msg)#}
#         $.each(args.msg,function (index,msg) {
#             let obj = '#id_'+ index
#             $(obj).next().text(msg[0]).parent().addClass('has-error')
#         })

# $('input').focus(function () {
#     $(this).next().text('').parent().removeClass('has-error')


# def yzm(request):
#     imgobj = Image.new('RGB',(350,35),get_random())
#     drawobj = ImageDraw.Draw(imgobj)
#     fontobj = ImageFont.truetype('static/font/qwq.ttf',30)
#     code = ''
#     for i in range(5):
#         lower = chr(random.randint(65,90))
#         number = str(random.randint(0,9))
#         tmp = random.choice([lower,number])
#         drawobj.text((i*60+30,0,),tmp,get_random(),fontobj)
#         code += tmp
#     request.session['code'] = code
#     ioobj = BytesIO()
#     imgobj.save(ioobj,'png')
#     return HttpResponse(ioobj.getvalue())


# django给你提供了一个可视化的界面用来让你方便的对你的模型表
# 进行数据的增删改查操作
# 如果你先想要使用amdin后台管理操作模型表
# 你需要先注册你的模型表告诉admin你需要操作哪些表
# 去你的应用下的admin. py中注册你的模型表
# from django. contrib import admin
# from app01 import models
# Register your models here.

# admin. site. register(models . UserInfo)
# admin. site . register(models. BLog)
# admin. site . register (models . Category)
# admin. site . register(models.Tag)
# admin. site. register(models . Article)
# admin. site . register (modeLs . ArticLe2Tag)
# admin. site. register (models . UpAndDown) 
# admin. site. register(modeLs . Comment)


# 1. 数据绑定尤其需 要注意的是用户和个人站点不要忘记绑定了
# 2.标签
# 3.标签和文章


# 共配置用户上传的文件存储位置
# MEDIA_ ROOT = 0S. path. join(BASE_ DIR， ' media ')
# #文件名随你自己

# 如何开设后端指定文件夹资源
# 首先你需要自己去urls. py书写固定的代码
# from django. views . static import serve
# from BBS14 import settings
# #暴露后端指定文件夹资源
# url(r'”media/ ( ?P<path>.*)' ,serve,{' document_ root ' :settings .MEDIA_ ROOT} )


# 图片防盗链
# #如何避免别的网站直接通过本网站的ur 1访问本网站资源
# #简单的防盗
# 我可以做到请求来的时候先看看当前请求是从哪个网站过来的
# 如果是本网站那么正常访问
# 如果是其他网站直接拒绝
# 请求头里面有一个专]记录请求来自于哪个网址的参数
# Referer: http://127 .0.0.1:8000/xxx/
# #如何避免
# 1.要么修改请求头referer
# 2.直接写爬虫把对方网址的所有资源直接下载到我们自己的服务器上


# 想在页面管理表，必须得在admin中注册admin.site.register(models.blog)表名
# nuLl=True
# 数据库该字段可以为空
# bLank=True
# admin后台管理该字段可以为空

# 注意
# 1.数据绑定尤其需要注意的是用户和个人站点不要忘记绑定了
# 2.标签
# 3.标签和文章
# 千万不要把别人的文章绑定标签


# 用户头像展示
# 1网址所使用的静态文件默认放在static文件夹下
# 2用户上传的静态文件也应该单独放在某个文件夹下
# media配置
# 该配置可以让用户上传的所有文件都固定存放在某一个指定的文件夹 下
# 配置用户上传的文件存储位置
# MEDIA_ROOT =os.path.join(BASE_DIR,'media') #文件名自己创建

# 固定代码(这行代码一定要卸载url的最后一行，不然会影响前面匹配！！！！！！！！)
# from django.views.static import serve
# from bbs import settings
# #暴露后端指定文件夹资源
# re_path(r'(?P<path>.*)',serve,{'document_root':settings.MEDIA_ROOT})
# 具体解释
# re_path(r'(?P<path>.*)',serve,{'document_root':settings.MEDIA_ROOT})
# 可以暴露MEDIA_ROOT下面的任何文件夹及文件的拼接


# 图片防盗链
# #如何避免别的网站直接通过本网站的ur 1访问本网站资源
# #简单的防盗
# 我可以做到请求来的时候先看看当前请求是从哪个网站过来的
# 如果是本网站那么正常访问
# 如果是其他网站直接拒绝
# 请求头里面有一一个专门记录请求来自于哪个网址的参数
# Referer: http://127.0.0. 1: 8000/xxx/ 
# #如何避免
# 1.要么修改请求头referer
# 2.直接写爬虫把对方网址的所有资源直接下载到我们自己的服务器上


# 全局404页面（等于上线，会让配置的static失效,需要暴露static文件出来（问题为解决））
# 1.在项目根目录新建一个404页面，名字叫404.html （就叫这个名字别改动）
# 2.404.html中body中写上{undefined{ request_path }}。以及自定义内容。
# 3.将settings中的DEBUG = True 改为False  （##kahn，如果为True，系统永远不会调用404错误页面）
# 4.将settings中的ALLOWED_HOSTS = [] 改为ALLOWED_HOSTS = ['*']

# from django.db.models.functions import TruncMonth
# date_obj = obj.annotate(month=TruncMonth('create_time')).values('month').annotate(conunt=Count('article__pk')).values('month','conunt')
# 列子：
# date_obj = models.Article.objects.filter(blog=blog_obj).annotate(month=TruncMonth('create_time')).values('month').annotate(conunt=Count('article__pk')).values('month','conunt')


# 时区问题
# LANGUAGE_CODE = 'en-us'
# TIME_ZONE = 'UTC'
# USE_I18N = True
# USE_L10N = True
# USE_TZ = True

# LANGUAGE_CODE = 'zh-hans'
# TIME_ZONE = 'Asia/Shanghai'
# USE_I18N = True
# USE_L10N = True
# USE_TZ = False


# 筛选功能，多个路由指向一个视图函数

# 未完成!

# setting 中的debug 在上线之后关闭，可以减少一些消耗，同时allow_host = [*] 开外开启